[小ネタ]SnowflakeのJava UDF実行環境情報を取得してみた
こんにちは!DA(データアナリティクス)事業本部 インテグレーション部の大高です。
先日、SnowflakeのPreview機能であるJava UDFsを試してみました。
このJava UDFsを試しているときに「Snowflake上では、Javaのバージョンなどはどうなっているのかな?」という点が気になったので、少し調べてみました。
注意点
今回は後述の通りに調査をしてみましたが、これはあくまで現時点での情報であり、Java UDFsもPreview機能ですので、将来的に変更される可能性が十分あります。
インラインUDFを作成して情報を取得してみる
では、情報を取得していきたいと思います。先日Java UDFsを試したときは、jarファイルを利用してUDF作成を行いましたが、今回は簡易に作成したいので、インラインコードでUDFを作成してみます。
java.lang.System#getProperties()を使ってみる
以下のようにUDFを定義して「System.getProperties()
から諸々の情報を一気に取得してみよう」という作戦です。
ローカル環境で動かすと以下のように情報が取得できるコードになります。
gopherProxySet=false awt.toolkit=sun.lwawt.macosx.LWCToolkit java.specification.version=11 (以下略)
UDFは以下のように定義しました。
CREATE OR REPLACE FUNCTION get_properties() RETURNS VARCHAR LANGUAGE java handler='TemporaryTestLibrary.getProperties' target_path='@~/udf/TemporaryTestLibrary.jar' as $$ class TemporaryTestLibrary { public static String getProperties(){ String properties = System.getProperties().toString(); properties = properties.replace("{", ""); properties = properties.replace("}", ""); properties = properties.replace(", ", System.lineSeparator()); return properties; } } $$;
作成できたので、呼び出してみます。
SELECT get_properties(); ╒══════════════════╕ │ GET_PROPERTIES() │ ╞══════════════════╡ │ │ ╘══════════════════╛ 1 Row(s) produced. Time Elapsed: 0.777s
か、空っぽでした。残念…。
java.lang.System#getProperty(String key)を使ってみる
少し別のUDFを作成してもう一度試してみます。今度は個別のキー指定が必要となりますがSystem.getProperty(String key)
を使ってみます。
CREATE OR REPLACE FUNCTION get_property(key VARCHAR) RETURNS VARCHAR LANGUAGE java handler='TemporaryTestLibrary.getProperty' target_path='@~/udf/TemporaryTestLibrary.jar' as $$ class TemporaryTestLibrary { public static String getProperty(String key){ return System.getProperty(key); } } $$;
java.version
を見てみましょう。
SELECT get_property('java.version'); ╒══════════════════════════════╕ │ GET_PROPERTY('JAVA.VERSION') │ ╞══════════════════════════════╡ │ 11.0.8 │ ╘══════════════════════════════╛ 1 Row(s) produced. Time Elapsed: 1.153s
今度は取得できました!
同様にしていくつかのキーを試した結果は以下になります。
プロパティ名 | 値 |
---|---|
java.version | 11.0.8 |
java.vendor | AdoptOpenJDK |
os.name | Linux |
os.arch | amd64 |
os.version | 4.19.84-33.70.amzn2.x86_64 |
AdoptOpenJDK
の11.0.8
が利用されているんですね。ということは、ローカルで開発するときにはこのバージョンと併せておくと無難そうです。また、OSはAmazon Linux 2
のようですね。
なお、各キーと取得できる情報については、以下のドキュメントに記載があります。
おまけ
UDFを作り直すときにCREATE OR REPLACE FUNCTION
を利用しましたが、target_path
で指定したファイルが既に存在する旨の以下のエラーが発生しました。この場合は、該当ファイルを削除するか、別ファイルを指定して対処すると良さそうです。
391513 (42601): SQL compilation error: TARGET_PATH cannot point to an existing file.
まとめ
以上、SnowflakeのJava UDF実行環境情報を取得してみました。
もちろん将来的に参照できなくなる可能性もありますが、こんな感じでランタイムの情報を調べることもできたよ、というネタでした。
どなたかのお役に立てば幸いです。それでは!